C语言 您所在的位置:网站首页 c语言 用指针定义一维数组和初始化 C语言

C语言

2023-07-07 21:15| 来源: 网络整理| 查看: 265

C高级第13天 枚举–enum

枚举是一个基本类型,枚举就是数据的有限罗列

枚举用来防止“魔鬼数字”

定义枚举类型的格式 enum 枚举类型名{ 成员1, 成员2, 成员3 = 初始值, 成员4, … 成员n };

注意事项: 1、enum和枚举类型名共同组成一个类型的名字,定义变量时需要写两个单词 2、枚举的成员之间用逗号分隔 3、枚举类型中成员1如果没有被赋值,默认初始值是0 4、后面的成员的值在前一位的基础上加一 5、如果某个成员被赋了初始值,那么后面的成员在这个值的基础上依此加一 6、枚举一旦定义好成员都是常量 7、枚举类型大小:取决于成员中最大的值,如果不超过4字节那么大小就是4字节,如果超过4字节,大小就是8字节,一般情况下都是4字节 8、当枚举成员名和局部变量名冲突时,采用局部优先原则

语法允许我们直接给枚举变量赋值,但是我们一般不这样做,这样就失去枚举的意义了

定义枚举变量的方式:

方式1:先定义类型,在定义变量 – 常用的用法 enum Gender{ boy,girl }; enum Gender g1,g2;

方式2:在定义类型的同时定义变量 enum Gender{ boy,girl }g1,g2; 这种写法g1和g2都是用enum Gender定义的变量

方式3:省略枚举类型名的定义变量的方式 enum{ boy,girl }g1,g2; 这种写法g1和g2也是用枚举类型定 义的变量,但是这种方法就没办法 定义新的变量了

枚举和typedef结合

方式1: typedef enum Gender{ boy,girl }gender_t; gender_t就是enum Gender的别名,用gender_t定义变量和用enum Gender定义变量是一样的

方式2: typedef enum{ boy,girl }gender_t; 这种情况下只能用gender_t定义变量了

结构体—struct

结构体是一个构造类型,结构体中可以是不同的类型的成员的集合,也可以是相同类型的成员的集合

一般情况下我们使用结构体,是为了处理不同类型的数据

定义结构体类型的格式

定义结构体类型的格式 struct 结构体类型名{ 数据类型1 成员1; 数据类型2 成员2; 数据类型3 成员3; 。。。。 数据类型n 成员n; }; 注意: 1、结构体的用法和枚举很像,但是又略有差别 2、成员之间用分号分隔 3、结构体成员都是变量 4、结构体的成员在内存上是连续的(从小到大–涉及内存对齐) 5、结构体变量之间可以相互赋值。

定义结构体变量

struct 结构体类型名 结构体变量名;

结构体访问成员的方式 struct Test{ char a; int b;

};

变量版:

结构体变量名.成员名 struct Test t1; t1.a = ‘M’; t2.b = 10;

指针版:

结构体变量名->成员名 struct Test *p1 = &t1; p1->a = ‘H’; p2->b = ‘10’;

定义一个结构体指针指向堆区一块由自己分配的结构体空间

struct Test *p2 = (struct Test *)malloc(sizeof(struct Test)); p2->a = ‘Q’; p2->b = 30; free(p2); p2 = NULL;

结构体也可以定义数组:

struct 结构体类型名 数组名[下标]; 操作结构体数组中的元素时和操作单个的结构体变量时一模一样的 每个结构体变量的成员都是相互独立的,不会互相影响 结构体中有数组成员时,数组成员定义好了也不能直接赋值。不管这个数组是否在结构体内,它终究是个数组,除了定义时,其他时候都不能整体赋值。

结构体变量的初始化和赋值 方式1:

struct Test{ int a; char b[32]; char c; }; struct Test t1; t1.a = 100; strcpy(t1.b,“hello”); t1.c = 50; 方式2: struct Test{ int a; char b[32]; char c; }; struct Test t1 = {10,“xiaoming”,20}; 方式3: atruct Test{ int a; char b[32]; char c; }t1; 定义结构体的同时定义变量 t1.a = 100; strcpy(t1.b,“hello”); t1.c = 50; 方式4: struct Test{ int a; char b[32]; char c; }t1 = {10,“hello”,20}; 方式5: struct Test{ int a; char b[32]; int c; }; struct Test t1 = {.a = 100, .b = “hello”}; struct Test t1 = {.a =100, .c = 30}; 部分初始化 方式6: struct Test{ int a; char b[32]; char c; }; struct Test t1; t1 = (struct Test){10,“hello”,20};

结构体数组的初始化和赋值 方式1:

struct Test{ int a; char b[32]; char c; }; struct Test s[2]; s[0].a = 10; strcpy(s[0].b,“hello”); s[0].c = 20; s[1].a = 30; strcpy(s[1].b,“hello”); s[1].c = 10;

方式2:

struct Test{ int a; char b[32]; char c; }; struct Test s[2] = { {10,“zhangsan”,20}, {30,“lisi”,40} }; 方式3: struct Test{ int a; char b[32]; char c; }; struct Test s[3] = { [0] = {10,“zhangsan”,20}, [2] = {30,“lisi”,40} }; 方式4: struct Test{ int a; char b[32]; char c; }; struct Test s[3] = { [0] = {.a = 10, .b = “zhangsan”}, [2] = {.a = 30, .c = 40} };

结构体清零 可以使用memset清0即可 #include

void *memset(void *s,int c,size_t n); 从给定的首地址s开始填充n个字节的c,给c传0即可达到清零的目的 struct Test{ int a; char b; };

在栈区清零:

struct Teat t1; memset(&t1,0,sizeof(t1));

在堆区清零

struct Test *p1 = (struct Test *)malloc(sizeof(struct Test)); memset(p1,0,sizeof(struct Test)); memset(&p1,0,sizeof(struct Test *)); 这种写法是错误的,是从,指针变量p所在的空间的首地址开始清零,也就是说清零的是p,也就是指针p的指向,清零的就不是我们想要清零的指针指向的堆区空间了

C语言中结构体里不能定义函数,但是可以定义函数指针(*p)();

** 结构体对齐** 64位系统中,按结构体中最大的成员对齐

long double在32位系统中是12字节;在64位系统中是16字节 在32位系统中: 1、如果成员都不超过4字节,按照最大的成员对齐 2、如果有成员大于等于4字节,则都按4字节对齐 3、要特别注意char和short连续存储的问题 对齐就只是对齐,不影响变量本身的大小!!!! struct Test{ char a; char b; }; struct Test{ char a; short b; }; struct Test{ int a; char b; char c; short d; }; struct Test{ long long a; char b; char c; short d; }; struct Test{ int a; char b; short d; char c; }; struct Test{ int a; short d; char b; char c; }; 结构体中嵌套结构体时的对其规则: # include

struct A{ int aa; char bb; };

struct B{ struct A hqyj; char cc; int dd; }; struct C{ short aa; short bb; short cc; };

struct D{ struct C hqyj; char dd; int ee; }; 因为A自身是4字节对齐的,所以A的char会占据四个字节,结构体A一共占据8个字节 C是2字节对齐的,所以结构体C一共占据6个字节。可以把后面的两个字节分给结构体D使用

结构体位域 是用来压缩结构体的一种手段 使用结构体位域可以将一个字节拆成多份使用

使用冒号加数字可以指定成员占用的bit位的数量 # include

struct LED{ unsigned char led0:1; unsigned char led1:1; unsigned char led2:1; unsigned char led3:1; unsigned char led4:1; unsigned char led5:1; unsigned char led6:1; unsigned char led7:1; }; 这时未给结构体变量分配空间 int main(){ printf(“%d\n”,sizeof(struct LED)); 占用一个字节 struct LED my_led; my_led.led0 = 1; my_led.led1 = 0; 可以给每一位分别赋值,它们彼此独立 } 注意:压缩之后能存储的数据范围也随之变小了 使用时不要超过范围

共用体(联合体)—union

定义共用体和共用体定义变量的方式都和结构体的使用方式一样,只不过是吧关键字struct换成union即可

共用体中所有成员共用同一块内存空间

共用体的所有成员首地址是一样的

共用体的大小取决于最大的成员

由于共用体中所有成员共用同一块内存空间,操作一个成员的值,其他成员的值也会发生变化,所以使用时要谨慎,防止数据被误修改

使用共用体判断计算机是小端存储还是大端存储

#include

union Test{ char a; int b; };

int main(){ union Test t1; t1.b = 0x12345678; if(0x78 == t1.a){ printf(“小端”); }else if(0x12 == t1.a){ printf(“大端”); } }

在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有